

#include <iostream>
using namespace std;

//class B;
//
//class A
//{
//	friend void func(const A& aa, const B& bb);
//public:
//	A()
//	{}
//
//private:
//	int _a1 = 1;
//	int _a2 = 2;
//};
//
//class B
//{
//	friend void func(const A& aa, const B& bb);
//public:
//	B()
//	{}
//
//private:
//	int _b1 = 3;
//	int _b2 = 4;
//};
//
//void func(const A& aa, const B& bb)
//{
//	cout << aa._a1 << endl;
//	cout << bb._b1 << endl;
//}
//
//int main()
//{
//	A aa;
//	B bb;
//	func(aa, bb);
//
//	return 0;
//}

//class A
//{
//	friend class B;
//
//private:
//	int _a1 = 1;
//	int _a2 = 2;
//};
//
//class B
//{
//public:
//	void func1(const A& aa)
//	{
//		cout << aa._a1 << endl;
//		cout << _b1 << endl;
//	}
//
//	void func2(const A& aa)
//	{
//		cout << aa._a2 << endl;
//		cout << _b2 << endl;
//	}
//
//private:
//	int _b1 = 11;
//	int _b2 = 22;
//};
//
//int main()
//{
//	A aa;
//	B bb;
//
//	bb.func1(aa);
//	bb.func2(aa);
//
//	return 0;
//}

//class A
//{
//public:
//	class B
//	{
//	public:
//		void foo(const A& a)
//		{
//			cout << _k << endl;
//			cout << a._a << endl;
//		}
//	};
//
//private:
//	static int _k;
//	int _a = 2;
//};
//
//int A::_k = 1;
//
//int main()
//{
//	A::B b;
//	A a;
//
//	b.foo(a);
//
//	return 0;
//}


//class A
//{
//public:
//	A(int a = 1)
//		:_a(a)
//	{
//		cout << "A(int a = 0)" << endl;
//	}
//
//	~A()
//	{
//		cout << "~A()" << endl;
//	}
//
//private:
//	int _a;
//};
//
//class Solution
//{
//public:
//	int Sum_Solution(int n)
//	{
//		// ...
//
//		return 0;
//	}
//};
//
//int main()
//{
//	A aa1;
//	//A aa2();// err
//
//	A();
//	A(1);
//
//	Solution().Sum_Solution(10);
//
//	return 0;
//}

class A
{
public:
	A(int a = 0)
		:_a(a)
	{
		cout << "A(int a = 0)" << endl;
	}

	A(const A& a)
	{
		cout << "A(const A& a)" << endl;
	}

	A& operator=(const A& a)
	{
		cout << "A& operator=(const A& a)" << endl;

		if (this != &a)
		{
			_a = a._a;
		}

		return *this;
	}

	~A()
	{
		cout << "~A()" << endl;
	}

private:
	int _a = 1;
};

void f1(A a)
{}

A f2(void)
{
	A aa;

	return aa;
}

int main()
{
	A aa1;
	f1(aa1);
	cout << endl;

	f1(1);
	cout << endl;

	cout << "*******************************" << endl;
	f2();
	cout << endl;

	aa1 = f2();
	cout << endl;

	return 0;
}